#pragma once
#include <functional>
#include <iostream>
// typedef int(*handleFunc)(void* agr);//不知道回调函数的参数类型，因此函数参数指定为void*类型（泛型），后面会根据实际的参数进行转换
//using handleFunc = int (*)(void *);
// 定义读写事件
enum class FDEvent
{
    TimeOut = 0x1,
    ReadEvent = 0x2,
    WriteEvent = 0x4,
};

// 可调用对象包装器打包的：1.函数指针 2.可调用对象
// 最终得到地址，但是没有进行调用
class Channel
{
public:
     using handleFunc = std::function<int(void *)>;
    Channel(int fd, FDEvent events, handleFunc readFunc, handleFunc writeFunc, handleFunc destoryFunc, void *arg)
        : m_fd(fd), readCallback(readFunc), writeCallback(writeFunc), destoryCallback(destoryFunc), m_arg(arg)
    {
        m_events = (int)events;
    }
    // 回调函数
    handleFunc readCallback;    // 读回调
    handleFunc writeCallback;   // 写回调
    handleFunc destoryCallback; // 销毁回调

    void writEventEnbale(bool flag)
    {
        if (flag)
        {
            m_events |= static_cast<int>(FDEvent::WriteEvent);//前后类型不匹配，需要强制类型转换
        }
        else
        {
            m_events = m_events & ~static_cast<int>(FDEvent::WriteEvent);
        }
    }
    // 判断是否需要检测文件描述符的写事件
    bool isWriteEventEnable()
    {
        return m_events & static_cast<int>(FDEvent::WriteEvent);
    }
    // 取出私有成员
    inline int getEvent()
    {
        return m_events;
    }
    inline int getSocket()
    {
        return m_fd;
    }
    inline const void *getArg()//加const表示只能拿到数据不能对其进行修改
    {
        return m_arg;
    }

private:
    int m_fd;
    int m_events;
    // 回调函数参数
    void *m_arg;
};
